//
//  HMComposeView.swift
//  01-SinaWeibo
//
//  Created by 周英培 on 16/5/28.
//  Copyright © 2016年 周英培. All rights reserved.
//

import UIKit


class HMComposeView: UIView {
    
    //保存按钮的数组
    private lazy var btns : [HMComposeBtn] = [HMComposeBtn]()
    
    //target属性
    var target : UIViewController?
    
    //此方法 在main控制器里 点击➕时调用
    func show(targetVC target: UIViewController) {
    
        self.target = target
        
       //控制器添加视图
        target.view.addSubview(self)
    
    }
    

    override init(frame: CGRect) {
        
        let rect = UIScreen.mainScreen().bounds
        
        super.init(frame: rect)
        
        setUpUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    //MARK:设置UI
    private func setUpUI() {
        //添加评估截图
        addSubview(backImageView)
        
        //实现高斯模糊
        //下面这种实现高斯模糊的方法是在iOS7  要用苹果系统提供的类来实现
//        let toolbar = UIToolbar(frame: backImageView.bounds)
//        addSubview(toolbar)
        
        //添加小图标
        addSubview(sloganImageView)
        
        
        //设置约束
        sloganImageView.snp_makeConstraints { (make) in

            make.centerX.equalTo(self)
            make.top.equalTo(self).offset(100)
        }
        
        //添加六个按钮
        addChildsBtn()
    
    }
    
    //MARK:设置动画
    //将要移动到父视图上面 显示动画 也就是改变Y值
    override func willMoveToSuperview(newSuperview: UIView?) {
       super.willMoveToSuperview(superview)
        
        //btns.enumerate 从第一个按钮开始逐步显示
        for (index,btn) in btns.enumerate() {
            
            startAnimation(btn, index: index, offSet: -350)
            
        }
    }
    
    //根据Y值 的增大 则将按钮从当前视图上移除
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        
        //btns.reverse().enumerate()  反转 从最后一个开始移除动画
        for (index,btn) in btns.reverse().enumerate() {
            
            startAnimation(btn, index: index, offSet: 350)
            
        }
        
    }
    
   //MARK:封装具体怎么动画的方法  btn:按钮  index:按钮的索引  offset：决定Y值 从而决定是将要移动到父视图上还是从父视图上面移除
    private func startAnimation(btn:HMComposeBtn,index:Int,offSet:CGFloat) {
    
        //delay: Double(index) * 0.02  延期的时间  每个按钮延期的时间不同 从而实现每个按钮逐步有规律的显示出来
    UIView.animateWithDuration(0.8, delay: Double(index) * 0.02, usingSpringWithDamping: 0.5, initialSpringVelocity: 5, options: [], animations: { 
        
        //修改Y值
        btn.center = CGPoint(x: btn.center.x, y: btn.center.y + offSet)
        
        }) { (_) in
            
            if offSet > 0 {
            
                //移除当前视图
                self.removeFromSuperview()
            
            }
            
            
        }
    
    }
    
    //MARK:添加六个按钮
    private func addChildsBtn() {
        
        let count = comPoseItems.count
        
        //设置按钮的frame
        let btnW : CGFloat = 80
        let btnH : CGFloat = 120
        let btnMargin : CGFloat = (ScreenWidth - 3 * btnW) / 4
        
        for i in 0..<count {
            
            //获取模型数据
            let itemM = comPoseItems[i]
            
            let btn = HMComposeBtn() //这句话放在外面 就只会创建一个btn
            
            btn.composeItem = itemM
            
            let row = i / 3
            let col = i % 3
            let btnX = CGFloat(col) * (btnMargin + btnW) + btnMargin
            let btnY = CGFloat(row) * (btnH + btnMargin) + ScreenHeight //- 350    //这一句不懂？？？ 这句话意思是 将要移动到父视图上面时，慢慢显示动画，要从屏幕下面用动画移动到父视图上面
            
            btn.frame = CGRect(x: btnX, y: btnY, width: btnW, height: btnH)
            
            //设置按钮的图片和文字  把下面赋值这些东西封装到自定义的btn里面
//            btn.setImage(UIImage(named: itemM.icon!), forState: .Normal)
//            btn.setTitle(itemM.title, forState: .Normal)
//            btn.setTitleColor(UIColor.darkGrayColor(), forState: .Normal)
//            btn.titleLabel?.textAlignment = .Center
//            btn.titleLabel?.font = UIFont.systemFontOfSize(18)
            
            //添加按钮的点击事件
            btn.addTarget(self, action: #selector(btnClick(_:)), forControlEvents: .TouchUpInside)
  
            //添加按钮
            self.addSubview(btn)
            
            //添加到数组中
            btns.append(btn)
        }
   
    }
    
    //MARK:点击按钮，此按钮放大，其他的按钮缩小
    @objc private func btnClick(btn:HMComposeBtn) {
    
        for button in btns {
            
            var scale : CGFloat = 0
            
            if button == btn {
                
                //放大
                scale = 1.2
                
            } else {
            
                //缩小
                scale = 0.5
            
            }
            
           UIView.animateWithDuration(0.25, animations: { 
            
            //修改形变
            button.alpha = 0
            button.transform = CGAffineTransformMakeScale(scale, scale)
            
            }, completion: { (_) in
                
                  //不能在这里面进行跳转 因为在循环里面
           })
            
        }
        
        //MARK:界面跳转  按钮的属性里面target里面对应的是控制器 所以根据target来获取控制器 视图view是不能跳转的
        guard let target = btn.composeItem?.target else {
        
        return
        
        }
        
        //根据字符串来获取控制器对应类型
        // 切记：下面获取类型时 在plist里面写的时候 控制器名称要有命名空间名称 它是在命名空间下的
        let type = NSClassFromString(target) as! UIViewController.Type
        
        //初始化控制器
        let vc = type.init()
        
        //嵌入导航控制器
        let nav = UINavigationController(rootViewController: vc)
        
        
        
        //进行跳转
        self.target?.presentViewController(nav, animated: true, completion: { 
            self.removeFromSuperview()
        })
        
        
    }
    
    //MARK:懒加载
    //屏幕上方的小的背景图片
    private lazy var sloganImageView : UIImageView = UIImageView(image: UIImage(named: "compose_slogan"))
    
    //屏幕截图  后面跟上.applyLightEffect()  是系统提供的工具类 用的这种方法
    private lazy var backImageView : UIImageView = UIImageView(image: UIImage.sanpShotCurrentWindow().applyLightEffect())
    
    //plist文件懒加载
    private lazy var comPoseItems : [HMComposeItem] = {

        //读取plist文件 获取数据
        let array = NSArray(contentsOfFile: NSBundle.mainBundle().pathForResource("Compose.plist", ofType: nil)!)as! [[String : AnyObject]]
        
        //创建可变数组 用来装取模型
        var arrMM = [HMComposeItem]()
        
        //遍历数组 字典转模型
        for item in array {
        
        let composeItem = HMComposeItem(dict: item )
            
            arrMM.append(composeItem)
        
        }
        
        return arrMM
    
    }()
    
    
    //点击移除当前界面 回到上一界面
//    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
//        self.removeFromSuperview()
//    }
    
    
    
}
